package com.fangs.search

import android.app.AlertDialog
import android.content.DialogInterface
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.text.TextUtils
import android.view.KeyEvent
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.inputmethod.EditorInfo
import android.widget.*
import butterknife.BindView
import butterknife.ButterKnife
import com.fangs.search.utils.KeyBoardUtil
import com.fangs.search.utils.StorageListSPUtils
import com.fangs.search.widget.FakeBoldTextView
import com.fangs.search.widget.FlowLayout
import java.util.ArrayList

class MainActivity : AppCompatActivity(), TextView.OnEditorActionListener,
    View.OnClickListener {
    // 回退
    @BindView(R.id.header_back_image)
    var mHeaderBackImage: ImageView? = null

    // EditText 中的搜索图标
    @BindView(R.id.search_header_image)
    var mSearchHeaderImage: ImageView? = null

    // 搜索输入文本框
    @BindView(R.id.search_header_tv)
    var mSearchHeaderTv: EditText? = null

    // 取消
    @BindView(R.id.header_cancel_tv)
    var mHeaderCancelTv: FakeBoldTextView? = null

    // 删除搜索历史
    @BindView(R.id.search_delete_history)
    var mSearchDeleteHistory: ImageView? = null

    // 展示搜索历史记录的布局
    @BindView(R.id.search_history_layout)
    var mSearchListLayout: LinearLayout? = null

    // 流式布局展示搜索历史
    @BindView(R.id.search_history_fl)
    var mSearchHistoryFl: FlowLayout? = null

    // 搜索历史
    private var mSearchHistoryLists: MutableList<String>? = null

    // 存储 搜索历史集合 的工具类
    private var mStorageListSPUtils: StorageListSPUtils? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        ButterKnife.bind(this)
        // 初始化
        init()
        mSearchHeaderTv!!.setOnEditorActionListener(this)
        mHeaderBackImage!!.setOnClickListener(this)
        mSearchHeaderImage!!.setOnClickListener(this)
        mHeaderCancelTv?.setOnClickListener(this)
        mSearchDeleteHistory!!.setOnClickListener(this)
        // 初始化搜索历史布局
        initView()
    }

    /**
     * 初始化
     */
    private fun init() {
        // 初始化搜索历史
        mSearchHistoryLists = ArrayList()
        // 初始化存储 搜索历史集合 的工具类
        mStorageListSPUtils = StorageListSPUtils(this, TAG)
    }

    override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
        return super.dispatchTouchEvent(ev)
    }

    /**
     * 初始化搜索历史布局
     */
    private fun initView() {
        val layoutInflater = LayoutInflater.from(this)
        // 获取 SharedPreferences 中已存储的 搜索历史
        mSearchHistoryLists = mStorageListSPUtils?.loadDataList(TAG_SEARCH_HISTORY)
        if (mSearchHistoryLists!!.size != 0) {
            mSearchListLayout!!.visibility = View.VISIBLE
            for (i in mSearchHistoryLists!!.indices.reversed()) {
                val textView = layoutInflater.inflate(
                    R.layout.search_history_tv,
                    mSearchHistoryFl,
                    false
                ) as TextView
                val historyStr = mSearchHistoryLists!![i]
                textView.text = historyStr
                // 设置搜索历史的回显
                textView.setOnClickListener {
                    mSearchHeaderTv!!.setText(historyStr)
                    mSearchHeaderTv!!.setSelection(historyStr.length)
                }
                // FlowLayout 中添加 搜索历史
                mSearchHistoryFl?.addView(textView)
            }
        }
    }

    /**
     * EditText 编辑完成点击软键盘搜索后的监听事件
     */
    override fun onEditorAction(v: TextView, actionId: Int, event: KeyEvent): Boolean {
        if (v.id == R.id.search_header_tv) {
            if (actionId == EditorInfo.IME_ACTION_SEARCH) {
                // 存取 SharedPreferences 中存储的搜索历史并做相应的处理
                processAction()
                // 点击软件盘搜索后，隐藏软键盘
                if (null != currentFocus) {
                    KeyBoardUtil.hideKeyboard(currentFocus, this@MainActivity)
                }
                return true
            }
        }
        return false
    }

    /**
     * 存取 SharedPreferences 中存储的搜索历史并做相应的处理
     */
    private fun processAction() {
        // 获取 EditText 输入内容
        val searchInput = mSearchHeaderTv!!.text.toString().trim { it <= ' ' }
        if (TextUtils.isEmpty(searchInput)) {
            Toast.makeText(
                this,
                resources.getString(R.string.app_search_input_empty),
                Toast.LENGTH_SHORT
            ).show()
        } else {
            // 先获取之前已经存储的搜索历史
            val previousLists: List<String> = mStorageListSPUtils?.loadDataList(TAG_SEARCH_HISTORY)!!
            if (previousLists.size != 0) {
                // 如果之前有搜索历史，则添加
                mSearchHistoryLists!!.clear()
                mSearchHistoryLists!!.addAll(previousLists)
            }
            // 去除重复，如果搜索历史中已经存在则remove，然后添加到后面
            if (!mSearchHistoryLists!!.contains(searchInput)) {
                // 如果搜索历史超过设定的默认个数，去掉最先添加的，并把新的添加到最后
                // 这里只展示10个搜索历史，根据需要修改为你自己想要的数值
                if (mSearchHistoryLists!!.size >= DEFAULT_SEARCH_HISTORY_COUNT) {
                    mSearchHistoryLists!!.removeAt(0)
                    mSearchHistoryLists!!.add(mSearchHistoryLists!!.size, searchInput)
                } else {
                    mSearchHistoryLists!!.add(searchInput)
                }
            } else {
                // 如果搜索历史已存在，找到其所在的下标值
                var inputIndex = -1
                for (i in mSearchHistoryLists!!.indices) {
                    if (searchInput == mSearchHistoryLists!![i]) {
                        inputIndex = i
                    }
                }
                // 如果搜索历史已存在，先从 List 集合中移除再添加到集合的最后
                mSearchHistoryLists!!.removeAt(inputIndex)
                mSearchHistoryLists!!.add(mSearchHistoryLists!!.size, searchInput)
            }
            // 存储新的搜索历史到 SharedPreferences
            mStorageListSPUtils!!.saveDataList(TAG_SEARCH_HISTORY, mSearchHistoryLists)
            Toast.makeText(
                this,
                resources.getString(R.string.app_search_input) + searchInput,
                Toast.LENGTH_SHORT
            ).show()
        }
    }

    /**
     * 处理点击事件
     */
    override fun onClick(v: View) {
        val viewId = v.id
        when (viewId) {
            R.id.search_header_image ->                 // 存取 SharedPreferences 中存储的搜索历史并做相应的处理
                processAction()
            R.id.search_delete_history ->                 // 删除搜索历史
                AlertDialog.Builder(this)
                    .setMessage(resources.getString(R.string.app_commit_delete_history))
                    .setCancelable(false)
                    .setPositiveButton(resources.getString(R.string.app_delete_confirm),
                        DialogInterface.OnClickListener { dialog, which -> // 清楚 SharedPreferences 中存储的搜索历史
                            mStorageListSPUtils?.removeDateList<String>(TAG_SEARCH_HISTORY)
                            mSearchHistoryLists!!.clear()
                            mSearchHistoryFl!!.removeAllViews()
                            // 删除之后，搜索历史布局隐藏
                            mSearchListLayout!!.visibility = View.GONE
                        })
                    .setNegativeButton(resources.getString(R.string.app_delete_cancel),
                        DialogInterface.OnClickListener { dialog, which -> dialog.dismiss() })
                    .create().show()
            R.id.header_cancel_tv ->                 // 取消
                finish()
            R.id.header_back_image ->                 // 回退
                finish()
        }
    }

    companion object {
        private val TAG = MainActivity::class.java.simpleName

        // SharedPreferences 存取 搜索历史 的标签
        private const val TAG_SEARCH_HISTORY = "tagSearchHistory"

        // 默认最多展示的搜索历史数
        // 这里只展示10个搜索历史，根据需要修改为你自己想要的数值
        private const val DEFAULT_SEARCH_HISTORY_COUNT = 10
    }
}